

package appstudio7i.controladores;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


import appstudio7i.excepciones.SalaRegistradaException;
import appstudio7i.excepciones.FaltaValorException;

import appstudio7i.modelo.Instrumento;


import appstudio7i.modelo.Local;
import appstudio7i.modelo.Sala;
import appstudio7i.modelo.Servicio;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.ArrayList;

/**
 *
 * @author admin
 * http://code.google.com/p/poo-upc2011/
 * jmontoyab@gmail.com's googlecode.com password: Zn4jQ4NY9Pz2 
 */

public class AdmSalas {
    
    private ArrayList<Sala> salas = new ArrayList<Sala>();
    private String rutaSalas = "salas.txt";
    private String rutaSala_Instrumentos = "sala_instrumentos.txt";
    private String rutaSala_Servicios = "sala_servicios.txt";

    public AdmSalas() {
        //Carga los datos al instanciar el administrador de salas
        cargarDatos();
        }                   
    
    //--------------------------------------------------------------------------
    //Gestión de Salas----------------------------------------------------------
    //--------------------------------------------------------------------------
    public boolean  registrarSala(String codigo, String nombre, int capacidad, BigDecimal costo, 
             boolean amplificadores, boolean aireAcondicionado, boolean parlantes, Local local, 
             ArrayList<Instrumento> instrumentos, ArrayList<Servicio> servicios) {
         
         boolean registrado = false;

        //validando datos de la sala
        validarDatosSala(codigo, nombre, capacidad, local);

        //validando si sala ya se encuentra registrada en otro local
        verificaSalaRegistradaEnOtroLocal(nombre, local.getCodigo());
        
        //crear un nueva sala        
        Sala nuevaSala = new Sala(codigo, nombre, capacidad, costo, amplificadores, aireAcondicionado, parlantes, local, instrumentos, servicios);

        //insertar en la coleccion de salas
        salas.add(nuevaSala);
        registrado = true;
        
        //actualizando archivo de salas
        actualizaDatos();
        
        return registrado;
         
        }
     
     public Sala obtenerSala(String _codigo) {         
         for(Sala sala : salas){
            if(sala.getCodigo().equals(_codigo))
                return sala;
            }
         return null;
        }
    
    public int obtenerTotalSalas() {
        return salas.size();
        }
    
    
    public void verificaSalaRegistradaEnOtroLocal(String nombreSala, String codigoLocal) {       
        for(Sala sala : salas){            
            if(sala.getLocal().getCodigo().equals(codigoLocal) && sala.getNombre().equals(nombreSala))
                throw new SalaRegistradaException("La sala: " + nombreSala + " ya se encuentra registrada en el local de código: " + codigoLocal);                                        
                }        
        }
    
    public void validarDatosSala(String codigo, String nombre, int capacidad, Local local) {
        
        if(codigo.equals(""))
            throw new FaltaValorException("Falta ingresar el código de la sala");
        else if(nombre.equals(""))
            throw new FaltaValorException("Falta ingresar el nombre de la sala");
        else if(capacidad == 0)
            throw new FaltaValorException("Falta indicar la capacidad de la sala");
        else if(local == null)
            throw new FaltaValorException("Falta indicar el local para la sala");         
         
        }
    
    //Búsqueda de salas---------------------------------------------------------    
    public ArrayList<Sala> buscarSala(String _nombreSala, Local _local, int _capacidad, 
            boolean _conGrabacion, String _fecha, String _horaInicio, String _horafin ) {
        //validar la busquesa
        
        return null;
        }
    
    
    //Gestión de instrumentos por sala------------------------------------------
    private ArrayList<Instrumento> cargarInstrumentosDeSala(String _codigo) {
        
        AdmInstrumentos admInstrumentos = new AdmInstrumentos();
        ArrayList<Instrumento> instrumentos = new ArrayList<Instrumento>();
        
        FileReader fr = null;
        BufferedReader br = null;
        
        try {
            fr = new FileReader(rutaSala_Instrumentos);
            br = new BufferedReader(fr);
            String linea;
                        
            while ((linea = br.readLine()) != null) {
                String [] datos = linea.split(";");
                if(datos[0].equals(_codigo)){                         
                    instrumentos.add(admInstrumentos.obtenerInstrumento(datos[1]));
                    }                
            }            
        } catch (FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fr) {
                    fr.close();
                } 
            } catch (Exception ee){
                ee.printStackTrace();
            }
        }        
        return instrumentos;
        }
    
    //Gestión de servicios por sala---------------------------------------------
    private ArrayList<Servicio> cargarServiciosDeSala(String _codigo) {
        
        AdmServicio admServicios = new AdmServicio();
        ArrayList<Servicio> servicios = new ArrayList<Servicio>();
        
        FileReader fr = null;
        BufferedReader br = null;
        
        try {
            fr = new FileReader(rutaSala_Servicios);
            br = new BufferedReader(fr);
            String linea;
                        
            while ((linea = br.readLine()) != null) {
                String [] datos = linea.split(";");
                if(datos[0].equals(_codigo)){                         
                    servicios.add(admServicios.obtenerServicio(datos[1]));
                    }                
            }            
        } catch (FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fr) {
                    fr.close();
                } 
            } catch (Exception ee){
                ee.printStackTrace();
            }
        }        
        return servicios;
    }
    
    //--------------------------------------------------------------------------
    //Gestión de archivo--------------------------------------------------------
    //--------------------------------------------------------------------------
    //Carga los datos desde el archivo de texto---------------------------------
    public ArrayList<Sala> cargarDatos() {
        AdmLocales admLocales = new AdmLocales();
        FileReader fr = null;
        BufferedReader br = null;
        
        try {
            fr = new FileReader(rutaSalas);
            br = new BufferedReader(fr);
            String linea;
            
            Sala sala = null;
            while ((linea = br.readLine()) != null) {
                String [] datos = linea.split(";");                                
                //codigo;nombre;capacidad;costo;amplificadores;aireAcondicionado;parlantes;local                                
                sala = new Sala(datos[0], datos[1], Integer.parseInt(datos[2]), BigDecimal.valueOf(Double.valueOf(datos[3])), 
                        Boolean.parseBoolean(datos[4]), Boolean.parseBoolean(datos[5]), Boolean.parseBoolean(datos[6]), 
                        admLocales.buscarLocal(datos[7]), cargarInstrumentosDeSala(datos[0]), cargarServiciosDeSala(datos[0]));                                
                salas.add(sala);               
            }            
        } catch (FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fr) {
                    fr.close();
                } 
            } catch (Exception ee){
                ee.printStackTrace();
            }
        }
        
        return salas;
    }
    
    //Actualiza los datos en el archivos de texto-------------------------------
    private void actualizaDatos() {
        //System.out.println("Total: " + salas.size() + " - rutaSalas: " + rutaSalas);        
        try {
            //guardando datos de salas.txt
            PrintWriter pwSalas = new PrintWriter(new FileWriter(rutaSalas));            
            for(Sala sala : salas){                                             
                pwSalas.println(sala.getCodigo() + ";"
                         + sala.getNombre() + ";"
                         + sala.getCapacidad() + ";"
                         + sala.getCosto() + ";"
                         + sala.isAmplificadores() + ";"
                         + sala.isAireAcondicionado() + ";"
                         + sala.isParlantes() + ";"
                         + sala.getLocal().getCodigo() + ";");                
            }
            pwSalas.close();
            
            //guardando datos en sala_instrumentos.txt                            
            PrintWriter pwSala_Instrumentos = new PrintWriter(new FileWriter(rutaSala_Instrumentos));            
            for(Sala sala : salas){                
                if(sala.getInstrumentos().size()>0){
                    for(Instrumento instrumento : sala.getInstrumentos()){                       
                        pwSala_Instrumentos.println(sala.getCodigo() + ";" + instrumento.getCodigo() + ";");                        
                        }
                    }                                 
                }                                                
            pwSala_Instrumentos.close();
            
            //guardando datos en sala_servicios.txt
            PrintWriter pwSala_Servicios = new PrintWriter(new FileWriter(rutaSala_Servicios));            
            for(Sala sala : salas){                            
                if(sala.getServicios().size()>0){
                    for(Servicio servicio : sala.getServicios()){                      
                        pwSala_Servicios.println(sala.getCodigo() + ";" + servicio.getCodigo() + ";");
                        }
                    }                                 
                }                                                
            pwSala_Servicios.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }        
        }            
    }
